﻿
// MFCGCView.h: CMFCGCView 类的接口
//
#pragma once
#include "P2.h"
#include "P3.h"
#include "Edge.h"
#include "Face.h"
#include "Vector.h"
class CMFCGCView : public CView
{

protected: // 仅从序列化创建
	CMFCGCView() noexcept;
	DECLARE_DYNCREATE(CMFCGCView)

// 习题参数
public:
	CMFCGCDoc* GetDocument() const;
	CPoint lineList[100][2];;//3-3左右键监听变量 最多存在100条
	int LineNum = 0;//3-3线段数目
	float nowAngle=0;//5-3旋转过的角度


	//7-1 旋转六面体的参数
	CP3 P[8];//点表
	CEdge E[12];//边表
	CFace F[6];//面表
	CBrush NewBbrush[7];//定义6个面的颜色
	CVector VN, VS;//N法向量,S视向量
	double R, Theta, Phi, d;//R,Theta,Phi视点在用户坐标系的球坐标,d视距
	double k[9];//运算常量
	CP3 ViewPoint;//视点球坐标
	CP2 ScreenP;//屏幕坐标系的二维坐标点
	BOOL first_71=true;//首次绘制
	void ReadPoint();//读入顶点表
	void ReadEdge();//读入边表
	void ReadFace();//读入面表
	void InitParameter();//参数初始化
	void PerProject(CP3);//透视投影
	void DoubleBuffer();//双缓冲
	void Draw7_1(CDC*, int);//绘制正方体		
	void exercises7_1(CDC* pDC);
// 操作
public:
// 重写
public:
	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
	virtual ~CMFCGCView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	//3-4反走样直线函数声明
	void wuLine(CDC* pDC, CPoint p0, CPoint p1);
	//4-7边缘填充算法声明
	void CMFCGCView::FillPolygon(CDC* pDC, COLORREF GetClr, CPoint P[], int MaxX);
	//4-9种子填充算法声明
	void CMFCGCView::SeedFill(CDC* pDC, int x, int y, COLORREF fillColor, COLORREF boundaryColor);
	//5-6在窗口中绘制未裁剪的线段函数声明
	void CMFCGCView::DrawLineInWindow(CDC* pDC, const CRect& leftRect, const CRect& windowRect, CPoint p1, CPoint p2);
	// 5-6在视区中绘制裁剪后的线段
	void CMFCGCView::DrawLineInViewport(CDC* pDC, const CRect& viewportRect, const CRect& windowRect, CPoint p1, CPoint p2);
	// 5-6Cohen-Sutherland裁剪算法
	bool CMFCGCView::CohenSutherlandClip(const CRect& rect, CPoint p1, CPoint p2, CPoint& clippedP1, CPoint& clippedP2);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};

#ifndef _DEBUG  // MFCGCView.cpp 中的调试版本
inline CMFCGCDoc* CMFCGCView::GetDocument() const
   { return reinterpret_cast<CMFCGCDoc*>(m_pDocument); }
#endif

